FlatKitPixelation.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using ExternPropertyAttributes;
  2. using UnityEngine;
  3. using UnityEngine.Rendering.Universal;
  4. namespace FlatKit {
  5. public class FlatKitPixelation : ScriptableRendererFeature {
  6. [Expandable]
  7. [Tooltip("To create new settings use 'Create > FlatKit > Pixelation Settings'.")]
  8. public PixelationSettings settings;
  9. private Material _effectMaterial;
  10. private DustyroomRenderPass _fullScreenPass;
  11. private bool _requiresColor;
  12. private bool _injectedBeforeTransparents;
  13. private ScriptableRenderPassInput _requirements = ScriptableRenderPassInput.Color;
  14. private const string ShaderName = "Hidden/FlatKit/PixelationWrap";
  15. private static int pixelSizeProperty => Shader.PropertyToID("_PixelSize");
  16. public override void Create() {
  17. // Settings.
  18. {
  19. if (settings == null) return;
  20. settings.onSettingsChanged = null;
  21. settings.onReset = null;
  22. settings.onSettingsChanged += SetMaterialProperties;
  23. settings.onReset += SetMaterialProperties;
  24. }
  25. // Material.
  26. {
  27. #if UNITY_EDITOR
  28. settings.effectMaterial = SubAssetMaterial.GetOrCreate(settings, ShaderName);
  29. if (settings.effectMaterial == null) return;
  30. #endif
  31. _effectMaterial = settings.effectMaterial;
  32. SetMaterialProperties();
  33. }
  34. {
  35. _fullScreenPass = new DustyroomRenderPass {
  36. renderPassEvent = settings.renderEvent,
  37. };
  38. _requirements = ScriptableRenderPassInput.Color;
  39. ScriptableRenderPassInput modifiedRequirements = _requirements;
  40. _requiresColor = (_requirements & ScriptableRenderPassInput.Color) != 0;
  41. _injectedBeforeTransparents = settings.renderEvent <= RenderPassEvent.BeforeRenderingTransparents;
  42. if (_requiresColor && !_injectedBeforeTransparents) {
  43. modifiedRequirements ^= ScriptableRenderPassInput.Color;
  44. }
  45. _fullScreenPass.ConfigureInput(modifiedRequirements);
  46. }
  47. }
  48. public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) {
  49. if (settings == null || !settings.applyInSceneView && renderingData.cameraData.isSceneViewCamera) return;
  50. if (renderingData.cameraData.isPreviewCamera) return;
  51. if (_effectMaterial == null) return;
  52. _fullScreenPass.Setup(_effectMaterial, _requiresColor, _injectedBeforeTransparents, "Flat Kit Pixelation",
  53. renderingData);
  54. renderer.EnqueuePass(_fullScreenPass);
  55. }
  56. protected override void Dispose(bool disposing) {
  57. _fullScreenPass?.Dispose();
  58. }
  59. private void SetMaterialProperties() {
  60. if (_effectMaterial == null) return;
  61. var pixelSize = Mathf.Max(1f / settings.resolution, 0.0001f);
  62. _effectMaterial.SetFloat(pixelSizeProperty, pixelSize);
  63. }
  64. }
  65. }